Chapter 3: Exercises

Part 1

  1. 請寫一個 mex 檔案 acfMex.c,來計算一個向量的自相關函數(Auto correlation function),其輸入為一個向量 x,輸出為向量 y,其中 y(i) 為 x 向右平移 (i-1) 個單位後,與原向量重覆部分的內積。若輸入向量 x 的長度為 n,則 y 的長度也是 n。
  2. 請寫一個 mex 檔案 acfMex2.c,功能如同上題,但若輸入為矩陣,則你的程式應針對每一個行向量進行自相關函數運算,並傳回一個與原矩陣有一樣行數的輸出矩陣。
  3. 請寫一個 mex 檔案 nanMeanMex.c,來計算一個實數向量的平均值,若向量中出現 nan 元素,則此元素不用於計算平均值。若輸入矩陣,則你的程式應針對每一個行向量進行運算,並傳回一個列向量。

    Hint
    你的程式會用到 MATLAB 的 API 函數 mxIsNaN(),以判定一個矩陣的元素是不是 NaN。

  4. 請寫一個 mex 檔案 nanMedianMex.c,來計算一個實數向量的中位數(Median),若向量中出現 nan 元素,則此元素不用於計算中位數。若輸入矩陣,則你的程式應針對每一個行向量進行運算,並傳回一個列向量。

    Hint
    你的程式會用到 MATLAB 的 API 函數 mxIsNaN(),以判定一個矩陣的元素是不是 NaN。

  5. 請寫一個 mex 檔案 myFindMex.c,來尋找某個數值是否出現在一個向量之中。此函數有兩種用法:
    • 第一種用法如下:
      index = myFindMex(vec, x)
      其中 vec 是所給的向量,x 是欲尋找的數值,index 則是所找到的索引。(此用法和 index = find(vec==x) 是一樣的。)由於在 vec 中的數值並無大小關係,所以你的程式碼必須採用 linear search 來找出所有 x 可能出現的位置。
    • 第二種用法如下:
      index = myFindMex(vec, x, 1)
      在此種用法下,你的程式會假設 vec 是已經排序過,所以會直接採用 binary search 來以最快速的方法來找出 x 所在的索引。
    為簡化題目,我們可以假設 vec 和 x 都是實數。

Part 2

  1. 請寫一個 mex 檔案 sortMex.cpp 來對一個向量進行排序,其使用方式和 MATLAB 內建的排序函式 sort 完全相同,如下:
    [sortedVec, index] = sortMex(vec)
    • 為了確認你的函式和 MATLAB 的 sort 有完全一樣的輸入和輸出,請寫一個 script 來進行測試,並說明你的測試方法。
    • 請對 sort 和 sortMex 進行計時,看看你寫的 sortMex 會不會比 MATLAB 內建的 sort 來得快,並說明原因。
    (為了簡化題目,我們假設 vec 是一個實數向量。)
  2. 請重複上題,但改用 medianMex.cpp 來模擬 MATLAB 內建的 median 函式。

    Hint
    如果你選對了演算法,你的函式應該跑得比 MATLAB 內建的 median 函式還要快!


MATLAB程式設計:進階篇